package cn.iocoder.yudao.module.ems.service.classification;

import java.util.*;
import javax.annotation.PostConstruct;
import javax.validation.*;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.ems.controller.admin.classification.vo.*;
import cn.iocoder.yudao.module.ems.dal.dataobject.classification.ClassificationDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 分类 Service 接口
 *
 * @author dason
 */
public interface ClassificationService {

    @PostConstruct
    @TenantIgnore
        // 初始化缓存，无需租户过滤
    void initLocalCache();

    /**
     * 创建分类
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createClassification(@Valid ClassificationCreateReqVO createReqVO);

    /**
     * 更新分类
     *
     * @param updateReqVO 更新信息
     */
    void updateClassification(@Valid ClassificationUpdateReqVO updateReqVO);

    /**
     * 删除分类
     *
     * @param id 编号
     */
    void deleteClassification(Long id);

    /**
     * 筛选分类列表
     *
     * @param reqVO 筛选条件请求 VO
     * @return 分类列表
     */
    List<ClassificationDO> getSimpleClassifications(ClassificationListReqVO reqVO);

    /**
     * 获得分类信息数组
     *
     * @param ids 分类编号数组
     * @return 分类信息数组
     */
    List<ClassificationDO> getClassifications(Collection<Long> ids);

    /**
     * 获得分类
     *
     * @param id 编号
     * @return 分类
     */
    ClassificationDO getClassification(Long id);

    /**
     * 校验分类们是否有效。如下情况，视为无效：
     * 1. 分类编号不存在
     * 2. 分类被禁用
     *
     * @param ids 角色编号数组
     */
    void validClassifications(Collection<Long> ids);

    /**
     * 获得指定编号的分类列表
     *
     * @param ids 分类编号数组
     * @return 分类列表
     */
    List<ClassificationDO> getSimpleClassifications(Collection<Long> ids);

    /**
     * 获得指定编号的分类 Map
     *
     * @param ids 分类编号数组
     * @return 分类 Map
     */
    default Map<Long, ClassificationDO> getClassificationMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return Collections.emptyMap();
        }
        List<ClassificationDO> list = getSimpleClassifications(ids);
        return CollectionUtils.convertMap(list, ClassificationDO::getId);
    }

    /**
     * 获得分类列表
     *
     * @param ids 编号
     * @return 分类列表
     */
    List<ClassificationDO> getClassificationList(Collection<Long> ids);

    /**
     * 获得分类分页
     *
     * @param pageReqVO 分页查询
     * @return 分类分页
     */
    PageResult<ClassificationDO> getClassificationPage(ClassificationPageReqVO pageReqVO);

    /**
     * 获得分类列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 分类列表
     */
//    List<ClassificationDO> getClassificationList(ClassificationExportReqVO exportReqVO);

    /**
     * 获得所有子分类，从缓存中
     *
     * @param parentId 分类编号
     * @param recursive 是否递归获取所有
     * @return 子分类列表
     */

    List<ClassificationDO> getClassificationsByParentIdFromCache(Long parentId, boolean recursive);

}
